/**
 * 系统配置增删改查相关接口
 * @Author: thoomi
 */

package controllers

import (
	"github.com/goravel/framework/contracts/http"
	"github.com/goravel/framework/facades"
	"goravel/app/models"
	"goravel/app/services"
	"goravel/app/types"
)

type RoleController struct {
	DbServer services.DBServer
}

func NewRoleController() *RoleController {
	return &RoleController{
		DbServer: services.NewRoleService(),
	}
}

// Index 角色列表
// @Summary      角色列表
// @Tags         Role
// @Router       /role [get]
func (c *RoleController) Index(ctx http.Context) http.Response {
	var modelList []models.SysRole
	query := facades.Orm().Query()
	//其他查询条件
	query = query.OrderBy("id", "desc")
	data, meta, err := c.DbServer.ListPage(ctx, &modelList, query, nil)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).DataPage(data, meta)
}

// Show 角色详情
// @Summary      角色详情
// @Tags         Role
// @Router       /role [get]
func (c *RoleController) Show(ctx http.Context) http.Response {
	return services.NewApiService(ctx).OK("Show")
}

// Store 新增角色
// @Summary      新增角色
// @Tags         Role
// @Router       /role [post]
func (c *RoleController) Store(ctx http.Context) http.Response {
	var createReq types.RoleCreateReq
	var err error
	err = ctx.Request().Bind(&createReq)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	validateErr, err := services.NewApiService(ctx).Validate(&createReq)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数校验错误", services.WithErrors(validateErr))
	}
	var model models.SysRole
	err = c.DbServer.Create(&model, &createReq)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).OK("stored")
}

// Update 更新角色
// @Summary      更新角色
// @Tags         Role
// @Router       /role/{id} [put]
func (c *RoleController) Update(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	var model models.SysRole
	var req types.RoleUpdateReq
	var err error
	err = ctx.Request().Bind(&req)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	validateErr, err := services.NewApiService(ctx).Validate(&req)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数校验错误", services.WithErrors(validateErr))
	}
	err = c.DbServer.Update(&model, &req, id)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).OK("updated")
}

// Destroy 删除角色
// @Summary      删除角色
// @Tags         Role
// @Router       /role/{id} [delete]
func (c *RoleController) Destroy(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	var model models.SysRole
	err := c.DbServer.Delete(&model, id)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).OK("deleted")
}
